package com.dabai.iot.mqtt.util;

import cn.hutool.core.util.StrUtil;
import com.dabai.iot.mqtt.model.ServerClient;
import org.apache.commons.lang3.tuple.Pair;
import org.apache.commons.lang3.tuple.Triple;

/**
 * 客户端工具类
 *
 * @author kev1n
 */
public class ClientUtil {

    /**
     * 拼接设备的 mqtt clientId
     *
     * @param productKey 产品Key
     * @param deviceSn   设备序列号
     */
    public static String deviceClientId(String productKey, String deviceSn) {
        return productKey + "_" + deviceSn;
    }

    /**
     * 设备相关 - 通过 clientId 获取产品Key和设备序列号
     *
     * @param clientId
     */
    public static Pair<String, String> getProductKeyAndDeviceSn(String clientId) {
        int index = clientId.indexOf("_");
        if (index < 0) {
            return null;
        }
        String productKey = clientId.substring(0, index);
        String deviceSn = clientId.substring(index + 1);

        return Pair.of(productKey, deviceSn);
    }

    /**
     * 服务端订阅 - 通过 clientId 获取租户编号、消费组ID、uuid
     * <p>
     * 服务端订阅时会按照 "Server" + "_" + tenantId + "_" + groupID + "_" + uuid 的方式拼接 clientId
     */
    public static Triple<String, String, String> getConsumerInfo(String clientId) {
        int atIndex = clientId.indexOf("@");
        String joinString = clientId.substring(atIndex + 1);
        String[] strings = StrUtil.splitToArray(joinString, "_");
        return Triple.of(strings[0], strings[1], strings[2]);
    }

    /**
     * 获取订阅的服务端信息
     * <p>
     * 服务端订阅时使用 "Server" + "_" + tenantId + "_" + groupID + "_" + uuid 的方式拼接 clientId
     */
    public static ServerClient parseClientId(String clientId) {
        if (clientId == null) {
            throw new IllegalArgumentException("服务端ID不能为空");
        }

        // 使用下划线分割字符串，限制最多分割为4部分
        String[] parts = clientId.split("_", 4);

        // 验证格式：必须包含 "Server" 和至少3个下划线分隔的部分
        if (parts.length != 4 || !"Server".equals(parts[0])) {
            throw new IllegalArgumentException("无效的客户端ID格式，必须为'Server_tenantId_groupID_uuid'");
        }

        ServerClient serverClient = new ServerClient();
        serverClient.setTenantId(parts[1]);
        serverClient.setGroupID(parts[2]);
        serverClient.setUuid(parts[3]);
        return serverClient;
    }

}
